Edisonのボタン押下をイベントで取得してみる
はじめに
センサーでボタンと連動しようとすると、弊社中村の記事で書いたようなサンプルが出てくることが多いと思います。
[Edison]ボタンでLEDを点灯させる[mraa] | Developers.IO
setInterval(function(){ var buttonValue = button.read(); if(buttonValue === 0) { console.log("off"); led.write(0); } else { console.log("on"); led.write(1); } },1000);
せっかくnode.jsなのだからsetIntervalで回すのではなくイベント駆動でできないかなと、 探していたところ以下のライブラリでイベント駆動でできそうです。
今回のサンプルは、上記のライブラリを用いてLEDをイベント駆動で光らせると言った内容になります。
実装
D2にボタンモジュールをつなぎます
光らせるLEDはボードに付いているのを用います。
今回のサンプルはXDKで作成しました。
package.json
{ "name": "hoge", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "dependencies": { "cylon": "^0.21.2", "cylon-firmata": "^0.18.0", "cylon-intel-iot": "^0.4.0" } }
main.js
var Cylon = require('cylon'); var turnOn = true; Cylon .robot() .connection('edison', { adaptor: 'intel-iot' }) .device('led', { driver: 'led', pin: 13, connection: 'edison' }) .device('touch', { driver: 'button', pin: 2, connection: 'edison' }) .on('ready', function(my) { my.touch.on('push', function() { if(!turnOn){ my.led.turnOn(); console.log('push on'); }else{ my.led.turnOff(); console.log('push off'); } turnOn = !turnOn; }); }); Cylon.start();
setIntervalではなく、touchのイベントでLEDを点滅させていることがわかるかと思います。
実行
今回npmモジュールを追加しているので、パッケージのインストールを行わせる必要があります。
XDK内のハンマーのアイコンを押下することでパッケージのインストールが行われます。
その後、プログラムを動かすことで、スイッチ押下でLEDの状態が変わることが確認できるかと思います。
まとめ
Cylonを用いることでボタンモジュールの押下をイベントで取得することができました。
他にもイベントがありそうなので、調べてみたいと思います。